if (!priv->model)
return;
- children = gtk_container_get_children (GTK_CONTAINER (menu));
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
for (child = children; child; child = child->next)
{
if (!(active && gtk_widget_get_visible (active)))
{
- for (i = GTK_MENU_SHELL (priv->popup_widget)->priv->children; i && !active; i = i->next)
+ GList *children;
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (priv->popup_widget));
+ for (i = children; i && !active; i = i->next)
{
child = i->data;
if (child && gtk_widget_get_visible (child))
active = child;
}
+ g_list_free (children);
}
if (active)
{
gint child_height;
-
- for (i = GTK_MENU_SHELL (priv->popup_widget)->priv->children; i && i->data != active; i = i->next)
+ GList *children;
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (priv->popup_widget));
+ for (i = children; i && i->data != active; i = i->next)
{
child = i->data;
rect_anchor_dy -= child_height;
}
}
+ g_list_free (children);
gtk_widget_measure (active, GTK_ORIENTATION_VERTICAL, -1,
&child_height, NULL, NULL, NULL);
switch (prop_id)
{
case PROP_ACTIVE:
- g_value_set_int (value, g_list_index (GTK_MENU_SHELL (menu)->priv->children, gtk_menu_get_active (menu)));
+ {
+ GList *children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ g_value_set_int (value, g_list_index (children, gtk_menu_get_active (menu)));
+ g_list_free (children);
+ }
break;
case PROP_ACCEL_GROUP:
g_value_set_object (value, gtk_menu_get_accel_group (menu));
gtk_container_remove (GTK_CONTAINER (priv->box), widget);
+ GTK_CONTAINER_CLASS (gtk_menu_parent_class)->remove (container, widget);
+
menu_queue_resize (menu);
}
GtkMenuPrivate *priv = menu->priv;
gtk_container_add (GTK_CONTAINER (priv->box), child);
+ gtk_menu_reorder_child (menu, child, position);
menu_queue_resize (menu);
}
{
GtkMenuPrivate *priv;
GtkWidget *child;
- GList *children;
+ GList *children, *l;
g_return_val_if_fail (GTK_IS_MENU (menu), NULL);
if (!priv->old_active_menu_item)
{
- child = NULL;
- children = GTK_MENU_SHELL (menu)->priv->children;
-
- while (children)
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ for (l = children; l; l = l->next)
{
- child = children->data;
- children = children->next;
+ child = l->data;
if (gtk_bin_get_child (GTK_BIN (child)))
break;
child = NULL;
}
+ g_list_free (children);
priv->old_active_menu_item = child;
if (priv->old_active_menu_item)
{
GtkMenuPrivate *priv;
GtkWidget *child;
+ GList *children;
GList *tmp_list;
g_return_if_fail (GTK_IS_MENU (menu));
priv = menu->priv;
- tmp_list = g_list_nth (GTK_MENU_SHELL (menu)->priv->children, index);
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ tmp_list = g_list_nth (children, index);
if (tmp_list)
{
child = tmp_list->data;
}
}
g_object_notify (G_OBJECT (menu), "active");
+ g_list_free (children);
}
/**
GtkWidget *child,
gint position)
{
- GtkMenuShell *menu_shell;
+ GtkWidget *sibling = NULL;
+ int i;
g_return_if_fail (GTK_IS_MENU (menu));
g_return_if_fail (GTK_IS_MENU_ITEM (child));
- menu_shell = GTK_MENU_SHELL (menu);
+ if (position < 0)
+ sibling = gtk_widget_get_last_child (menu->priv->box);
- if (g_list_find (menu_shell->priv->children, child))
+ for (i = 0; i < position; i++)
{
- menu_shell->priv->children = g_list_remove (menu_shell->priv->children, child);
- menu_shell->priv->children = g_list_insert (menu_shell->priv->children, child, position);
-
- menu_queue_resize (menu);
+ if (sibling == NULL)
+ sibling = gtk_widget_get_first_child (menu->priv->box);
+ else
+ sibling = gtk_widget_get_next_sibling (sibling);
}
+
+ gtk_box_reorder_child_after (GTK_BOX (menu->priv->box), child, sibling);
}
static gboolean
{
GtkWidget *next = g_ptr_array_index (menubars, index + 1);
GtkMenuShell *new_menushell = GTK_MENU_SHELL (next);
+ GList *children = gtk_menu_shell_get_items (new_menushell);
- if (new_menushell->priv->children)
- to_activate = new_menushell->priv->children->data;
+ if (children)
+ to_activate = children->data;
+ g_list_free (children);
}
g_ptr_array_free (menubars, TRUE);
GtkMenuBar *menu_bar = GTK_MENU_BAR (container);
gtk_container_remove (GTK_CONTAINER (menu_bar->box), widget);
+
+ GTK_CONTAINER_CLASS (gtk_menu_bar_parent_class)->remove (container, widget);
+}
+
+static void
+gtk_menu_bar_reorder_child (GtkMenuBar *menu_bar,
+ GtkWidget *child,
+ gint position)
+{
+ GtkWidget *sibling = NULL;
+ int i;
+
+ if (position < 0)
+ sibling = gtk_widget_get_last_child (menu_bar->box);
+
+ for (i = 0; i < position; i++)
+ {
+ if (sibling == NULL)
+ sibling = gtk_widget_get_first_child (menu_bar->box);
+ else
+ sibling = gtk_widget_get_next_sibling (sibling);
+ }
+
+ gtk_box_reorder_child_after (GTK_BOX (menu_bar->box), child, sibling);
}
static void
GtkMenuBar *menu_bar = GTK_MENU_BAR (menu_shell);
gtk_container_add (GTK_CONTAINER (menu_bar->box), child);
+ gtk_menu_bar_reorder_child (menu_bar, child, position);
}
iface->get_action_target_value = gtk_menu_item_get_action_target_value;
}
-static GtkMenuShell *
+GtkMenuShell *
gtk_menu_item_get_menu_shell (GtkMenuItem *item)
{
return GTK_MENU_SHELL (gtk_widget_get_ancestor (GTK_WIDGET (item), GTK_TYPE_MENU_SHELL));
#define __GTK_MENU_ITEM_PRIVATE_H__
#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkmenushell.h>
#include <gtk/gtkactionhelperprivate.h>
#include <gtk/gtkcssnodeprivate.h>
#include <gtk/gtkeventcontrollermotion.h>
void _gtk_menu_item_popup_submenu (GtkWidget *menu_item,
gboolean with_delay);
void _gtk_menu_item_popdown_submenu (GtkWidget *menu_item);
+GtkMenuShell *
+ gtk_menu_item_get_menu_shell (GtkMenuItem *menu_item);
G_END_DECLS
GtkWidget *widget);
static void gtk_menu_shell_remove (GtkContainer *container,
GtkWidget *widget);
-static void gtk_menu_shell_forall (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data);
-static void gtk_menu_shell_real_insert (GtkMenuShell *menu_shell,
- GtkWidget *child,
- gint position);
static void gtk_real_menu_shell_deactivate (GtkMenuShell *menu_shell);
static GType gtk_menu_shell_child_type (GtkContainer *container);
static void gtk_menu_shell_real_select_item (GtkMenuShell *menu_shell,
container_class->add = gtk_menu_shell_add;
container_class->remove = gtk_menu_shell_remove;
- container_class->forall = gtk_menu_shell_forall;
container_class->child_type = gtk_menu_shell_child_type;
klass->submenu_placement = GTK_TOP_BOTTOM;
klass->activate_current = gtk_real_menu_shell_activate_current;
klass->cancel = gtk_real_menu_shell_cancel;
klass->select_item = gtk_menu_shell_real_select_item;
- klass->insert = gtk_menu_shell_real_insert;
klass->move_selected = gtk_menu_shell_real_move_selected;
/**
g_signal_emit (menu_shell, menu_shell_signals[INSERT], 0, child, position);
}
-static void
-gtk_menu_shell_real_insert (GtkMenuShell *menu_shell,
- GtkWidget *child,
- gint position)
-{
- GtkMenuShellPrivate *priv = menu_shell->priv;
-
- priv->children = g_list_insert (priv->children, child, position);
-
- if (gtk_widget_get_parent (child) == NULL)
- gtk_widget_set_parent (child, GTK_WIDGET (menu_shell));
-}
-
/**
* gtk_menu_shell_deactivate:
* @menu_shell: a #GtkMenuShell
GtkMenuShellPrivate *priv = menu_shell->priv;
GtkWidget *menu_item;
GdkEvent *event;
- GtkWidget *item_shell;
+ GtkMenuShell *item_shell;
event = gtk_get_current_event ();
menu_item = gtk_get_event_target_with_type (event, GTK_TYPE_MENU_ITEM);
if (menu_item)
- item_shell = gtk_widget_get_ancestor (GTK_WIDGET (menu_item), GTK_TYPE_MENU_SHELL);
+ item_shell = gtk_menu_item_get_menu_shell (GTK_MENU_ITEM (menu_item));
if (menu_item &&
_gtk_menu_item_is_selectable (menu_item) &&
- item_shell == GTK_WIDGET (menu_shell))
+ item_shell == menu_shell)
{
if (menu_item != menu_shell->priv->active_menu_item)
{
if (menu_item)
{
if (_gtk_menu_item_is_selectable (menu_item) &&
- item_shell == GTK_WIDGET (menu_shell) &&
+ item_shell == menu_shell &&
menu_item != priv->active_menu_item)
{
priv->active = TRUE;
if (menu_item)
{
GtkWidget *submenu = GTK_MENU_ITEM (menu_item)->priv->submenu;
- GtkWidget *parent_menu_item_shell = gtk_widget_get_parent (menu_item);
+ GtkMenuShell *parent_menu_item_shell = gtk_menu_item_get_menu_shell (GTK_MENU_ITEM (menu_item));
if (!_gtk_menu_item_is_selectable (GTK_WIDGET (menu_item)))
return;
{
GtkMenuShell *menu_shell = GTK_MENU_SHELL (container);
GtkMenuShellPrivate *priv = menu_shell->priv;
- gint was_visible;
-
- was_visible = gtk_widget_get_visible (widget);
- priv->children = g_list_remove (priv->children, widget);
if (widget == priv->active_menu_item)
{
g_signal_emit_by_name (priv->active_menu_item, "deselect");
priv->active_menu_item = NULL;
}
-
- gtk_widget_unparent (widget);
-
- /* Queue resize regardless of gtk_widget_get_visible (container),
- * since that's what is needed by toplevels.
- */
- if (was_visible)
- gtk_widget_queue_resize (GTK_WIDGET (container));
}
-static void
-gtk_menu_shell_forall (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data)
-{
- GtkMenuShell *menu_shell = GTK_MENU_SHELL (container);
- GtkWidget *child;
- GList *children;
-
- children = menu_shell->priv->children;
- while (children)
- {
- child = children->data;
- children = children->next;
-
- (* callback) (child, callback_data);
- }
-}
-
-
static void
gtk_real_menu_shell_deactivate (GtkMenuShell *menu_shell)
{
g_object_unref (menu_item);
}
-static GList *
+GList *
gtk_menu_shell_get_items (GtkMenuShell *menu_shell)
{
return GTK_MENU_SHELL_GET_CLASS (menu_shell)->get_items (menu_shell);
case GTK_MENU_DIR_PREV:
gtk_menu_shell_move_selected (menu_shell, -1);
- if (!had_selection && !priv->active_menu_item && priv->children)
+ if (!had_selection && !priv->active_menu_item)
_gtk_menu_shell_select_last (menu_shell, TRUE);
break;
case GTK_MENU_DIR_NEXT:
gtk_menu_shell_move_selected (menu_shell, 1);
- if (!had_selection && !priv->active_menu_item && priv->children)
+ if (!had_selection && !priv->active_menu_item)
gtk_menu_shell_select_first (menu_shell, TRUE);
break;
gint (*get_popup_delay) (GtkMenuShell *menu_shell);
gboolean (*move_selected) (GtkMenuShell *menu_shell,
gint distance);
+ GList * (*get_items) (GtkMenuShell *menu_shell);
/*< private >*/
gpointer padding[8];
struct _GtkMenuShellPrivate
{
- GList *children;
-
GtkWidget *active_menu_item; /* This is not an "active" menu item
* (there is no such thing) but rather,
* the selected menu item in that MenuShell,
void _gtk_menu_shell_set_keyboard_mode (GtkMenuShell *menu_shell,
gboolean keyboard_mode);
gboolean _gtk_menu_shell_get_keyboard_mode (GtkMenuShell *menu_shell);
+GList *gtk_menu_shell_get_items (GtkMenuShell *menu_shell);
G_END_DECLS
GtkTreeMenuPrivate *priv = menu->priv;
gboolean is_separator = FALSE;
GtkWidget *item;
+ GList *children;
item = gtk_tree_menu_get_path_item (menu, path);
{
/* Destroy the header item and then the following separator */
gtk_widget_destroy (item);
- gtk_widget_destroy (GTK_MENU_SHELL (menu)->priv->children->data);
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ gtk_widget_destroy (children->data);
+ g_list_free (children);
priv->menu_with_header = FALSE;
}
GtkWidget *item;
gboolean is_header;
gboolean sensitive;
+ GList *children;
path = gtk_tree_model_get_path (tree_model, iter);
/* For header items we need to set the sensitivity
* of the following separator item
*/
- if (GTK_MENU_SHELL (menu)->priv->children &&
- GTK_MENU_SHELL (menu)->priv->children->next)
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ if (children && children->next)
{
- GtkWidget *separator =
- GTK_MENU_SHELL (menu)->priv->children->next->data;
+ GtkWidget *separator = children->next->data;
gtk_widget_set_sensitive (separator, sensitive);
}
+ g_list_free (children);
}
}
}
&:backdrop { background-color: $backdrop_bg_color; }
- > menuitem {
+ > box > menuitem {
min-height: 16px;
padding: 4px 8px;